package com.cidetec.utils;

import com.cidetec.modelo.entidad.Libro;
import com.cidetec.modelo.entidad.LibroReferencia;
import com.cidetec.modelo.entidad.LibroUbicacion;
import com.cidetec.modelo.entidad.Persona;
import java.lang.reflect.Field;
import java.util.Comparator;
import org.primefaces.model.SortOrder;

/**
 *
 * @author Carlos
 */
public class LazySorterLibro implements Comparator<Libro> {

    private String sortField;

    private SortOrder sortOrder;

    public LazySorterLibro(String sortField, SortOrder sortOrder) {
        this.sortField = sortField;
        this.sortOrder = sortOrder;
    }

    @Override
    public int compare(Libro libro1, Libro libro2) {
        try {

            Object value1;
            Object value2;
            Field field1;
            Field field2;
            String compere = sortField;
//            System.out.println(sortField);
            if (sortField.contains("libroReferencia")) {
                compere = compere.replace("libroReferencia.", "");
                LibroReferencia libroReferencia1 = libro1.getLibroReferencia();
                LibroReferencia libroReferencia2 = libro2.getLibroReferencia();

                field1 = libroReferencia1.getClass().getDeclaredField(compere);
                field2 = libroReferencia2.getClass().getDeclaredField(compere);
                field1.setAccessible(true);
                field2.setAccessible(true);
                value1 = field1.get(libroReferencia1);
                value2 = field2.get(libroReferencia2);
            } else if (sortField.contains("libroUbicacion")) {
                compere = compere.replace("libroUbicacion.", "");
                LibroUbicacion libroUbicacion1 = libro1.getLibroUbicacion();
                LibroUbicacion libroUbicacion2 = libro2.getLibroUbicacion();

                field1 = libroUbicacion1.getClass().getDeclaredField(compere);
                field2 = libroUbicacion2.getClass().getDeclaredField(compere);
                field1.setAccessible(true);
                field2.setAccessible(true);
                value1 = field1.get(libroUbicacion1);
                value2 = field2.get(libroUbicacion2);
            } else {
                field1 = libro1.getClass().getDeclaredField(sortField);
                field2 = libro2.getClass().getDeclaredField(sortField);
                field1.setAccessible(true);
                field2.setAccessible(true);
                value1 = field1.get(libro1);
                value2 = field2.get(libro2);
            }
            int value = ((Comparable) value1).compareTo(value2);

            return SortOrder.ASCENDING.equals(sortOrder) ? value : -1 * value;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
}
